import * as docx from 'docx';
import { ICommonParams } from '@feidao/service/interfaces';
import zip from '@feidao/web/atom/nodejs/zip/zip';

export default async function atom(msg: ICommonParams, action_id: string, session_id: string, spaceid: string) {

	// 文档地址 https://docx.js.org/#/examples

	/**
	 * 参数
	 * 访问下载地址:http://127.0.0.1:8889/create-docx?id=ceshi&spaceid=webtest
	 * 传入了两个参数
	 */

	// 接收参数
	const query = msg.query;
	const _id = query.id;
	const _spaceid = query.spaceid;

	// 创建docx
	// 设置文件属性
	const opts = {
		title: 'title', // 标题
		subject: 'subject', // 主题
		creator: 'creator', // 创建人
		keywords: 'keywords', // 标记
		description: 'description', // 描述
		lastModifiedBy: 'lastModifiedBy' // 最后一次保存者
		// revision: 'revision' // 修订号
		// externalStyles: '' // 外部样式 引入之后必须有节点使用此样式
	};

	// 设置页面布局
	const section_opt = {
		// width: 10000, // 宽 17.64 厘米 必须介于 0.26和55.87 厘米 之间
		// height: 10000 // 高
		// orientation: docx.PageOrientation.LANDSCAPE, // 纸张方向 PORTRAIT 横 LANDSCAPE 纵
		// top: 3000, // 页边距 上 5.29 厘米
		// right: 4000, // 页边距 右 7.05 厘米
		// bottom: 3000,//  页边距 下
		// left: 2000, // 页边距 坐 3.53 厘米
		// header: 500, // 版式 距边界：页眉 0.88 厘米
		// footer: 2000 // 版式 距边界：页脚 3.53 厘米
		// gutter: 500, // 页边距 装订线 0.88 厘米
		// mirror: false // 未知

		// space: 1000, //  列属性
		// linePitch: 1000 // 表格属性
	};
	const doc = new docx.Document(opts, section_opt);

	/**
	 * 创建段落
	 * 添加段落
	 * 创建表格
	 * 添加表格
	 * 创建图片
	 * 添加图片
	 * 添加链接
	 */
	// 设置页眉
	doc.Header.addParagraph(new docx.Paragraph('header text'));
	// 设置页脚
	doc.Footer.addParagraph(new docx.Paragraph('footer text'));

	///////////////////// 自定义段落样式 /////////////////////////////////

	const ps = doc.Styles.createParagraphStyle('sid', 'name');
	// ps.allCaps(); // 未知
	ps.bold() // 加粗
		.center() // 居中
		.characterSpacing(30) // 字体 间距 1.5磅
		.color('999999') // 字体颜色
		.doubleStrike() // 双删除线
		.font('Calibri') // 字体
		.indent({ right: 30 }) // 缩进 left: 20, 左缩进0.04厘米。
		.italics() // 斜体
		.justified() // 两端对其
		.keepLines() // 段落 换行与分页 段中不分页
		.keepNext() // 段落 换行与分页 与下段同页
		.leftTabStop(30)
		.maxRightTabStop()
		.next('nid')
		.quickFormat()
		.size(15) // 字号 6号
		.spacing({ after: 30 }); // 段落 间距 段后1.5磅


	// 分页
	/**
	 * pageBreak 与之后的内容分页
	 * pageBreakBefore 与之前的内容分页
	 */
	doc.createParagraph("我是设置的自定义段落，我是设置的自定义段落，我是设置的自定义段落，我是设置的自定义段落，我是设置的自定义段落，我是设置的自定义段落").style('sid').pageBreak();

	///////////////////// 自定义段落样式 /////////////////////////////////

	doc.createParagraph("Second Page");

	//////////////////////// 列出段落 /////////////////////////////////////////
	const abstractNum = new docx.Numbering().createAbstractNumbering();

	abstractNum.createLevel(0, "upperRoman", "%1", "start").addParagraphProperty(new docx.Indent({ left: 720, hanging: 260 }));

	abstractNum.createLevel(1, "decimal", "%2.", "start").addParagraphProperty(new docx.Indent({ left: 720, hanging: 980 }));

	abstractNum.createLevel(2, "lowerLetter", "%1)", "start").addParagraphProperty(new docx.Indent({ left: 720, hanging: 1700 }));

	const concrete = new docx.Numbering().createConcreteNumbering(abstractNum);

	/**
	 * setNumbering 设置为列表
	 * concrete
	 * 0 列表级别，从0开始到8
	 */
	doc.addParagraph(new docx.Paragraph('numbering1').setNumbering(concrete, 0));
	doc.addParagraph(new docx.Paragraph('numbering 2').setNumbering(concrete, 1));
	doc.addParagraph(new docx.Paragraph('numbering3').setNumbering(concrete, 2));

	//////////////////////// 列出段落 /////////////////////////////////////////

	doc.createParagraph("three Page").pageBreakBefore();

	doc.addParagraph(new docx.Paragraph("Hello World"));
	doc.addParagraph(new docx.Paragraph("Hello World on another page").pageBreakBefore());

	/////////////////////////// 添加脚注 ///////////////////////////////
	// 将鼠标放到文本上显示脚注内容
	/**
	 * referenceFootnote 设置脚注编号
	 */
	const paragraph = new docx.Paragraph("Hello World").referenceFootnote(1);
	const paragraph2 = new docx.Paragraph("Hello World").referenceFootnote(2);

	doc.addParagraph(paragraph);
	doc.addParagraph(paragraph2);

	doc.createFootnote(new docx.Paragraph("Test"));
	doc.createFootnote(new docx.Paragraph("My amazing reference"));
	///////////////////////////// 添加脚注 /////////////////////////////

	// 添加书签
	/**
	 * anchorID 书签名称
	 * Lorem Ipsum 针对添加书签内容 显示的内容
	 */
	const bookmark = doc.createBookmark('anchorID', "Lorem Ipsum");


	// 创建段落
	/**
	 * bullet 项目符号
	 */
	const paragraph3 = new docx.Paragraph('我是段落').bullet();
	paragraph3.addBookmark(bookmark);
	paragraph3.addRun(new docx.TextRun('runing'));
	// 添加到document
	doc.addParagraph(paragraph3);

	//////////////////////////// 正文 //////////////////////////////////////

	/**
	 * 可以对段落添加书签
	 */


	// 创建带样式的段落 标题1~标题5
	/**
	 * heading1()
	 * heading2()
	 * heading3()
	 * heading4()
	 * heading5()
	 */

	// 设置内容样式为 标题
	doc.addParagraph(new docx.Paragraph('标题').title().pageBreakBefore());
	// 设置样式 标题1 居中
	doc.addParagraph(new docx.Paragraph('标题1').heading1().center());
	// 设置样式 标题2 左对齐
	doc.addParagraph(new docx.Paragraph('标题2').heading2().left());
	// 设置样式 标题3 右对齐
	doc.addParagraph(new docx.Paragraph('标题3').heading3().right());
	// 设置样式 标题4 两端对齐
	doc.addParagraph(new docx.Paragraph('标题4').heading4().justified());
	// 设置样式 标题5 添加标题间隔
	doc.addParagraph(new docx.Paragraph('标题5').heading5().thematicBreak());
	doc.addParagraph(new docx.Paragraph('标题6').heading6());


	const text = new docx.TextRun("My awesome text here for my university dissertation");
	// 加粗
	text.bold();
	// 斜体
	text.italic();
	// 下划线
	text.underline();

	const text1 = new docx.TextRun('正文哦~~~~~~~~~~~~~~~');
	// 删除线
	text1.strike();

	const text2 = new docx.TextRun('正文哦------------------');
	// 双删除线
	text2.doubleStrike();
	// 下标
	text2.subScript();
	const text3 = new docx.TextRun('正文哦---------正文哦---------');
	// 上标
	text3.superScript();
	text3.allCaps();
	const text4 = new docx.TextRun('正文哦---------正文哦---------正文哦');

	text4.smallCaps();
	text4.break();
	const text5 = new docx.TextRun('----正文哦---------正文哦---------正文哦-----正文哦');
	doc.addParagraph(new docx.Paragraph().addRun(text).addRun(text1).addRun(text2).addRun(text3).addRun(text4).addRun(text5));

	//////////////////////////// 正文 //////////////////////////////////////

	//////////////////////////// 图片 //////////////////////////////////////
	//////////////////////////// 图片 //////////////////////////////////////

	//////////////////////////// 表格 //////////////////////////////////////
	// 创建table
	const table = doc.createTable(4, 4);

	// 表格的行和列是从0开始

	// 获取某一个单元格并设置内容
	table.getCell(2, 2).addContent(new docx.Paragraph("Hello"));

	// 设置单元格
	table.getCell(2, 2)
		.CellProperties.Borders.addTopBorder(docx.BorderStyle.DASH_DOT_STROKED, 3, "red")
		.addBottomBorder(docx.BorderStyle.DOUBLE, 3, "blue")
		.addStartBorder(docx.BorderStyle.DOT_DOT_DASH, 3, "green")
		.addEndBorder(docx.BorderStyle.DOT_DOT_DASH, 3, "#ff8000");

	// 获取第二行，并将第二个和第三个单元格合并
	table.getRow(1).mergeCells(1, 2);

	table.getCell(0, 0).addContent(new docx.Paragraph('第一个单元格'));

	table.getCell(0, 0).CellProperties
		// .setVerticalAlign(docx.VerticalAlign.BOTTOM) // 设置单元格 底部对齐，上，中，下
		// .setWidth(200, docx.WidthType.DXA) // 设置单元格宽度
		.setShading({ color: 'D8BFD8' });

	// 设置表格宽度， PERCENTAGE 百分比
	table.setWidth(docx.WidthType.NIL, '16.1cm');


	//////////////////////////// 表格 //////////////////////////////////////

	const packer = new docx.Packer();
	const res = await (() => {
		return new Promise<Buffer>((resolve, reject) => {
			packer.toBuffer(doc).then(async (buffer) => {
				resolve(buffer);
			});
		});
	})();

	////////////////////// 导出一个docx文档 //////////////////////////

	// return {
	// 	attachment: 'test.docx',
	// 	buff: res,
	// 	content_type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
	// };

	////////////////////// 导出一个docx文档 //////////////////////////

	////////////////////////// 导出压缩包 /////////////////////////////////
	const rt = await zip({ file: Buffer.from(res), path: 'test.docx' });
	return {
		attachment: '压缩包名称.zip',
		buff: rt,
		content_type: 'application/octet-stream'
	};
	////////////////////////// 导出压缩包 /////////////////////////////////
}
